/**
*  \file    smuldiv.h
*
*  \brief   multiply division routines with data type limit saturation
*
*  \author  Francesco D'Aprea <francesco.daprea@linde-mh.de>
*
*
*/

#ifndef SMULDIV_H_INCLUDED
#define SMULDIV_H_INCLUDED

/*================================================[ public includes  ]================================================*/
#include "../cfg/prj.h"
#include "../saturated/scast.h"

/*================================================[ public defines   ]================================================*/

#define SATURATED_MULDIV(T_VAL, T_NEXT) \
   T_NEXT res = ( (T_NEXT)( (T_NEXT)val * (T_NEXT)mul ) ) / (T_NEXT)div; \
   return saturated_cast_##T_NEXT##_##T_VAL( res );

/*================================================[ public datatypes ]================================================*/

/*================================================[ public variables ]================================================*/

/*================================================[ public functions ]================================================*/

STATIC_INLINE U8  saturated_muldiv_U8( U8 val, U8 mul, U8 div )
{
   SATURATED_MULDIV( U8, U16 )
}
STATIC_INLINE U16 saturated_muldiv_U16( U16 val, U16 mul, U16 div )
{
   SATURATED_MULDIV( U16, U32 )
}
STATIC_INLINE S8  saturated_muldiv_S8( S8 val, S8 mul, S8 div )
{
   SATURATED_MULDIV( S8, S16 )
}
STATIC_INLINE S16 saturated_muldiv_S16( S16 val, S16 mul, S16 div )
{
   SATURATED_MULDIV( S16, S32 )
}

/*====================================================================================================================*/

#endif

/***********************************************************************************************************************
*                             Copyright 2010 Linde Material Handling. All rights reserved.                             *
***********************************************************************************************************************/
